﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _005_面对对象编程_继承
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
                        Boss boss = new Boss();
                        //boss.AI();//继承：父类里面所有的数据成员和函数成员都会继承到子类
                        boss.Attack();//会先去boss类里面调用被调用的函数(如 AI Move)，然后才会返回主函数这边调用Attack（）;

                        Enemy enemy;
                        enemy = new Boss();//父类声明的对象，可以使用子类去构造
                        //但是子类声明的对象不能使用父类去构造（因为子类的功能包含了父类的功能，天生就比父类强）用功能小的构造器是不能够完成功能大的构造的
                        //enemy虽然使用父类进行了声明，但是使用了子类构造，所以本质上是一个子类类型的，我们可以强制类型转换成子类类型；


                        Boss bass = (Boss)enemy;
                        boss.Attack();
            */

            //这里为试错学习
            /*Enemy enemy = new Enemy();
            Boss boss = (Boss)enemy;//一个对象是什么类型的 主要看它是通过什么构造的
                                    //这里enemy使用了父类的构造函数，所以只有父类中的字段和方法，不能被强制转换成子类*/



            //举一反三:那子类拥有父类的公开的字段和方法，可以强制转换吗？
            Boss boss = new Boss();
            Enemy enemy = (Enemy) boss;
            enemy.AI();
            //实验结果是可以的，也可以去调用Enemy里的构造函数，但是不能去调用Boss类的东西。只是转换成了普通的Enemy的；
            Console.ReadKey();
        }
    }
}
